package com.openlogic.common.logic.node.parse;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.text.StringEscapeUtils;
import org.noear.solon.annotation.Component;
import org.noear.solon.core.event.AppBeanLoadEndEvent;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.openlogic.common.logic.node.enums.ParseTypeEnums;
import com.openlogic.common.logic.node.factory.NodeParseFactory;
import com.openlogic.common.logic.utils.OpeatorValidateUtils;

/**
* @ClassName: LineParse
* @Description: 线条解析处理器 
* @author weiyongpeng
* @date 2024年7月14日 上午11:50:47
 */
@Component
public class LineParseHandler extends BaseParseHandler {
	
//	private static final Logger logger = LoggerFactory.getLogger(LineParseHandler.class);

	@Override
	protected Map<Object, List<?>> setResultMap(JSONObject nodeInfoJsonObject, JSONObject lineInfoJsonObject) {
//		logger.info("开始解析所有Line节点...");
		Map<Object, List<?>> map = new TreeMap<Object, List<?>>();
		// 设置字段含义
		map.put("Name", setFiledName(ParseTypeEnums.LINE_INFO.getParsetype()));
		// 设置节点Value
		map.put("Value", getAllValueInfo(nodeInfoJsonObject,lineInfoJsonObject));
		return map;
	}

	@Override
	protected List<List<?>> getAllValueInfo(JSONObject nodeInfoJsonObject, JSONObject lineInfoJsonObject) {
		Map<String,String> areMap=getAreaNodeSeq(nodeInfoJsonObject);		
		Map<String,String> lineMap=new HashMap<String,String>();			
		getValue(lineInfoJsonObject.toString(),lineMap); 
		List<List<?>> resultList=new ArrayList<List<?>>();
		for(Map.Entry<String,String> entry:lineMap.entrySet()){
			 JSONObject tmpObject = JSON.parseObject(entry.getValue().toString());
			 List<String> tmpList=new ArrayList<String>();
			 getEveryElementByLine(entry.getKey(),tmpObject,tmpList,areMap); //获取所有线条的属性
			 resultList.add(tmpList);
		}
		
		/**********
		 * 将循环域与外部节点的连线，替换成循环域的第一个节点和最后一个节点与外部直接的关系
		 * *************/		
		for(int seq=0;seq<resultList.size();seq++){  
			@SuppressWarnings("unchecked")
			List<String> tmp= (List<String>) resultList.get(seq);
			String toStr=tmp.get(4).toString(); //使用连线信息中to 查找是否是循环域 如果是循环域 将对应的to值替换成循环域的第一节点
			if(areMap.get(toStr)!=null&&!"".equals(areMap.get(toStr).toString())){
				String[] str=areMap.get("F_"+toStr).toString().split("#");
				tmp.set(4, str[0]);
				resultList.set(seq, tmp);
			}
			String fromStr=tmp.get(3).toString(); //使用连线信息中from 查找是否是循环域 如果是循环域 将对应的from值替换成循环域的最后一个节点
			if(areMap.get(fromStr)!=null&&!"".equals(areMap.get(fromStr).toString())){
				String[] str=areMap.get("E_"+fromStr).toString().split("#");
				tmp.set(3, str[0]);
				resultList.set(seq, tmp);
			}
		}
		areMap=null;
		lineMap=null;
		return resultList;
	}
	
	/**
	* 描述：获取连线数据
	* @Title: getEveryElementByLine
	* @param key
	* @param tmpObject
	* @param tmpList
	* @param areMap
	* @author weiyongpeng
	* @date  2024年7月15日 上午10:45:19
	 */
	private List<String> getEveryElementByLine(String id, JSONObject tmpObject, List<String> 		list,
			Map<String, String> areMap) {
		list.add(id); //获取id
		list.add(tmpObject.get("name").toString()); //获取name
		list.add(tmpObject.get("type").toString()); //获取type
		list.add(tmpObject.get("from").toString()); //获取from
		list.add(tmpObject.get("to").toString());   //获取to
		String lineValue=tmpObject.get("value")==null?tmpObject.get("name").toString():tmpObject.get("value").toString(); //无value值的将name的信息放入其中
		list.add(StringEscapeUtils.unescapeXml(getLineValue(lineValue)));  //获取线条上的value值			
		getFirstAndEndNodeByArea(tmpObject,areMap);		
		return list;
	}
	
	/**
	* 描述：获取线条的各个元素的值：id name  type from to  value
	* @Title: getLineValue
	* @param str
	* @return
	* @author weiyongpeng
	* @date  2024年7月15日 上午11:36:52
	 */
	private String getLineValue(String str) {
		String result = "";
		if (!OpeatorValidateUtils.validateIsOp(str))
			return str;
		JSONArray tmp = JSON.parseArray(str);
		for (int len = 0; len < tmp.size(); len++) {
			JSONArray sTmp = JSON.parseArray(tmp.get(len).toString());
			for (int n = 0; n < sTmp.size(); n++) {
				JSONObject obj = JSON.parseObject(sTmp.get(n).toString());
				result += obj.get("value") == null ? "" : obj.get("value").toString() + "#";
			}
			result += "&@";
		}
		return result;
	}

	/**
	* 描述：确定循环域中的第一个节点和最后一个节点的ID
	* @Title: getFirstAndEndNodeByArea
	* @param tmpObject
	* @param areMap
	* @return
	* @author weiyongpeng
	* @date  2024年7月15日 上午11:36:27
	 */
	private Map<String, String> getFirstAndEndNodeByArea(JSONObject tmpObject, Map<String, String> areMap) {
		Map<String, String> map = new HashMap<>();
		for (Map.Entry<String, String> en : areMap.entrySet()) { // 处理循环域中的线条 将循环域ID替换成循环域中第一个节点id
			if (en.getKey().startsWith("E_") || en.getKey().startsWith("F_"))
				continue;
			String startStr = "";
			if (areMap.get("E_" + en.getKey()) == null || "".equals(areMap.get("E_" + en.getKey()))) { // 不存在结束节点
				startStr = en.getValue();
			} else {
				startStr = areMap.get("E_" + en.getKey());
			}
			String endStr = "";
			if (areMap.get("F_" + en.getKey()) == null || "".equals(areMap.get("F_" + en.getKey()))) {
				endStr = en.getValue();
			} else {
				endStr = areMap.get("F_" + en.getKey());
			}

			map.put("E_" + en.getKey(), startStr.replace(tmpObject.get("from").toString() + "#", "")); // 循环域中最后一个节点
			map.put("F_" + en.getKey(), endStr.replace(tmpObject.get("to").toString() + "#", "")); // 循环域中第一个节点
		}
		areMap.putAll(map);
		return map;
	}

	@Override
	public void onEvent(AppBeanLoadEndEvent event) throws Throwable {
		NodeParseFactory.register(ParseTypeEnums.LINE_INFO.getParsetype(), this);
	}

}
